package com.study.authority;

public class TestChange {
    public static void main(String[] args) {
        Animal a = new Animal();
        Cat c = new Cat();
        Dog d = new Dog();
        //没有继承关系的不能强制类型转换
        //Cat c1 = (Cat)d;
        //向上转型
        a.toShow(c);
        a.toShow(d);
        //父类引用指向子类对象
        Animal a1 = new Cat();
        System.out.println(a1.tail_height);
        a1.q();
        //虽然a1变量的类型是Animal，但是指向的仍然是Cat类型的对象，只是通过变量只能调用子父类中都有的方法
        Cat c1 = (Cat)a1;
        System.out.println(c1.tail_height);
        //a2变量的指向是Animal类型的对象
        //强制类型转换就会产生错误 java.lang.ClassCastException
        //所以编译器在编译时只会检查类型之间是否存在继承关系，有则通过；
        // 而在运行时就会检查它的真实类型，是则通过，否则抛出ClassCastException异常。
        // 所以在继承中，子类可以自动转型为父类，
        // 但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功，否则失败。
//        Animal a2 = new Animal();
//        Cat c2 = (Cat)a2;
//        System.out.println(c2.tail_height);
    }
}
class Animal{
    double tail_height = 0.0;
    private void show(){
        System.out.println("private method");
    }
    public void toShow(Animal a){
        a.show();
    }
    public void q(){
        System.out.println("Animal's q");
    }
}
class Cat extends Animal{
    double tail_height = 10.4;
    int age = 2;
    public void eatFish(){
        System.out.println("cat eat fish");
    }
    public void q(){
        System.out.println("Cat's q");
    }
}
class Dog extends Animal{
    public void eatBone(){
        System.out.println("dog eat bone");
    }
}